//
//  HMStatusViewModel.swift
//  WB25
//
//  Created by HM on 2017/7/4.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
import YYText
class HMStatusViewModel: NSObject {

    // 模型
    var homeModel: HMHomeModel?{
        didSet{
            // 认证
            verifiedImage = dealVerifiedImage(verified: homeModel?.user?.verified ?? -1)
            // 会员等级
            mbrankImage = dealMbrankImage(mbrank: homeModel?.user?.mbrank ?? 0)
            // 微博来源
            sourceText = dealSinaSource(source: homeModel?.source)
            
            
            originalAttributedText = dealSinaContentAttributedText(text: homeModel?.text)
            retweetAttributedText = dealSinaContentAttributedText(text: homeModel?.retweeted_status?.text)
        }
    }
    // 认证图片
    var  verifiedImage: UIImage?
    /// 会员等级
    var mbrankImage: UIImage?
    /// 微博时间
    var createdAtText: String?{
        return dealSinaTime(created_at: homeModel?.created_at)
    }
    // 微博来源
    var sourceText: String?
    // 原创微博富文本
    var originalAttributedText: NSMutableAttributedString?
    // 转发微博富文本
    var retweetAttributedText: NSMutableAttributedString?

}
//MARK: - 处理微博正文图文混排(原创微博和转发微博)
// reason: 'NSMutableRLEArray replaceObjectsInRange:withObject:length:: Out of bounds'
/*
 
 
    中[哈哈]国[嘻嘻]
    [哈哈] range = {1,4}
    [嘻嘻] range = {6,4}
    // 从前到后 正向遍历 第一次结果完成后
    中图国[嘻嘻]
    // 第二次结果时候
    中图国[嘻嘻
 
    // 从后往前做
    // 第一次
    中[哈哈]国图
    // 第二次
    中图国图
 */


extension HMStatusViewModel{
    fileprivate func dealSinaContentAttributedText(text: String?) -> NSMutableAttributedString?{
//        print(text)
        // 判断text是否为nil
        guard let t = text else {
            return nil
        }
        // 通过字符串获取到可变的富文本
        let allAttr = NSMutableAttributedString(string: t)
        // 中文 \u4e00-\u9fa5
        // 使用正则开始匹配
        let matchResult = try! NSRegularExpression(pattern: "\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]", options: []).matches(in: t, options: [], range: NSRange(location: 0, length: t.characters.count))
        
        for match in matchResult.reversed() {
            // 获取每个位置的图片描述
            let result = (t as NSString).substring(with: match.range)
            // 是否找到对应的chs
            guard let emoticonModel = HMEmoticonTools.share.getEmoticonModelWithChs(chs: result) else{
                continue
            }
            // 获取全路径
            let allPath = emoticonModel.allPath ?? ""
            
            // 获取image
            let image = UIImage(named: allPath, in: HMEmoticonTools.share.emoticonBundle, compatibleWith: nil)
            
            guard let i = image else {
                continue
            }
            
            guard let attr = NSMutableAttributedString.yy_attachmentString(withEmojiImage: i, fontSize: HMNormalFontSize) else{
                continue
            }
//            // 创建文本附件
//            let att = NSTextAttachment()
//            // 设置image
//            att.image = image
//            // 获取行高
//            let lineHeight = UIFont.systemFont(ofSize: HMNormalFontSize).lineHeight
//            //bounds
//            att.bounds = CGRect(x: 0, y: -3, width: lineHeight, height: lineHeight)
//            // 通过文本附件创建不可变富文本
//            let attr = NSAttributedString(attachment: att)
            // 替换指定位置的字符串
            allAttr.replaceCharacters(in: match.range, with: attr)
        }
        allAttr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: HMNormalFontSize)], range: NSRange(location: 0, length: allAttr.length))
        
        // 处理@xx #xx# httpxxx
        
        /*
         匹配用户：@[a-zA-Z0-9\\u4e00-\\u9fa5_\\-]+
         匹配话题：#[^#]+#
         匹配URL：([hH]ttp[s]{0,1})://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\-~!@#$%^&*+?:_/=<>.',;]*)?
         */
        dealAllAttrSetupTextHighLight(allAttr: allAttr, pattern: "@[a-zA-Z0-9\\u4e00-\\u9fa5_\\-]+")
        dealAllAttrSetupTextHighLight(allAttr: allAttr, pattern: "#[^#]+#")
        dealAllAttrSetupTextHighLight(allAttr: allAttr, pattern: "([hH]ttp[s]{0,1})://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\-~!@#$%^&*+?:_/=<>.',;]*)?")
        
        return allAttr
    }
    
    // 把当前allAttr里面的@xx 话题 或者是url的地址都要匹配出来 设置高亮效果
    func dealAllAttrSetupTextHighLight(allAttr: NSMutableAttributedString, pattern: String){
        
        
        // 结果集合
        let matchResult = try! NSRegularExpression(pattern: pattern, options: []).matches(in: allAttr.string, options: [], range: NSRange(location: 0, length: allAttr.string.characters.count))
        // 设置富文本高亮效果
        let highlightBorder = YYTextBorder(fill: UIColor.gray, cornerRadius: 2)
        // 背景的范围调整
        highlightBorder.insets = UIEdgeInsets(top: 2, left: 0, bottom: 0, right: 0)
        // 定义高亮对象
        let highlight = YYTextHighlight()
        highlight.setColor(HMThemeColor)
        highlight.setBackgroundBorder(highlightBorder)
        
        // 遍历
        for match in matchResult{
            // 显示为红色呢?
            allAttr.addAttributes([NSForegroundColorAttributeName: UIColor.red], range: match.range)
            // 把"高亮"属性设置到某个文本范围
            allAttr.yy_setTextHighlight(highlight, range: match.range)
        }
        
    }
}

extension HMStatusViewModel{
    //MARK: - 处理微博来源
    fileprivate func dealSinaSource(source: String?) -> String?{
        // 判断是否为nil 且是否保存">
        guard let s = source, s.contains("\">") else {
            return "来自 黑马25期微博"
        }
        
        // 获取起始
        let startIndex = s.range(of: "\">")!
        // 获取结束
        let endIndex = s.range(of: "</")!
        //lowerBound 底左侧 upperBound 高 右侧 (升序 从左到右)
        let result = s.substring(with: startIndex.upperBound..<endIndex.lowerBound)
        return "来自 " + result
    }
}

extension HMStatusViewModel{
    //MARK: - 处理微博时间
    /*
     - 时间的业务逻辑
     - 微博时间是否是今年
     - 是今年
     - 是今天
     -如果发布微博时间和当前时间求差
     - 如果s < 60 显示刚刚
     - 如果s >=60 && s < 3600 显示xx分钟前
     - 如果 s >= 3600 显示 xx小时前
     - 是昨天
     - 昨天 12:12
     - 是其它
     - 05月05日 12:12
     - 不是今年
     - 格式: 2015年09月09日 12:12
     */
    fileprivate func dealSinaTime(created_at: Date?) -> String?{
        // 判断它是否为nil
        guard let d = created_at else {
            return nil
        }
        // 测试数据
//        let d = d1.addingTimeInterval(-3600*24 * 365)
        
        // 定义时间格式化
        let df = DateFormatter()
        // 记录日期格式字符串
        let dateFormatString: String
        // 判断是否是今年
        if isThisYear(sinaDate: d) {
            // 日历类
            let calendar = Calendar.current
            // 如果是今天
            if calendar.isDateInToday(d) {
                // 计算发布微博日期和当前日期比较差值
                let s = Int(-d.timeIntervalSinceNow)
                // 显示刚刚
                if s < 60 {
                    return "刚刚"
                }else if s >= 60 && s < 3600{
                    return "\(s/60)分钟前"
                }else{
                    return "\(s/3600)小时前"
                }
            }else if calendar.isDateInYesterday(d){
                // 昨天
                // 昨天 12:12
                dateFormatString = "昨天 HH:mm"
            }else{
                // 其它
                // 05月05日 12:12
                dateFormatString = "MM月dd日 HH:mm"
            }
        }else{
            // 格式: 2015年09月09日 12:12
//            print("其它")
            // 指定格式
            dateFormatString = "yyyy年MM月dd日 HH:mm"
        }
        // 指定格式
        df.dateFormat = dateFormatString
        // 返回
        return df.string(from: d)
        
    }
    // 判断是否是今年
    fileprivate func isThisYear(sinaDate: Date) -> Bool{
        // 定义时间格式化
        let df = DateFormatter()
        // 指定格式
        df.dateFormat = "yyyy"
        // 计算出当前的系统日期
        let currentDate = Date()
        // 通过日期获取日期字符串
        // 新浪微博
        let sinaString = df.string(from: sinaDate)
        // 当前时间
        let currentString = df.string(from: currentDate)
        return sinaString == currentString
    }
}

extension HMStatusViewModel{
    
    //MARK: - 处理会员等级业务逻辑
    /// 会员等级 1-6
    fileprivate func dealMbrankImage(mbrank: Int) -> UIImage?{
        if mbrank >= 1 && mbrank <= 6 {
            return UIImage(named: "common_icon_membership_level\(mbrank)")
        }
        return UIImage(named: "common_icon_membership")
    }
    
    // 处理用户认证图片
    // 认证类型 -1：没有认证，1，认证用户，2,3,5: 企业认证，220: 达人
    fileprivate func dealVerifiedImage(verified: Int) -> UIImage?{
        // 图片名称
        var imgName = ""
        switch verified {
        case 1:
            imgName = "avatar_vip"
        case 2,3,5:
            imgName = "avatar_enterprise_vip"
        case 220:
            imgName = "avatar_grassroot"
        default:
            imgName = "avatar_vgirl"
        }
        return UIImage(named: imgName)
    }
}
